home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Tool Chest / Dev.CD Feb 97 TC.toast / Sample Code / Interapplication Communication / 7Edit 3.1 / Sources / SVAESelect.c < prev    next >
Encoding:
Text File  |  1995-11-20  |  6.2 KB  |  244 lines  |  [TEXT/CWIE]

  1. // SVAESelect.c
  2. //
  3. // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
  4. // 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1995, all rights reserved.
  6.  
  7. #include "SVAESelect.h"
  8.  
  9. #include <Windows.h>
  10.  
  11. #include "SVEditAEUtils.h"
  12. #include "SVEditWindow.h"        // for DPtrFromWindowPtr()
  13.  
  14. #include "SVAETextUtils.h"
  15.  
  16. // -----------------------------------------------------------------------
  17. //    Name:         DoSelect
  18. //    Purpose:    Handles the 'Select' Apple Event, extracting the direct
  19. //                object (which is the text range to set the selection to) 
  20. //                'Select' is equivalent to 'set the selection to...'
  21. // -----------------------------------------------------------------------
  22.      
  23. pascal OSErr    DoSelect(const AppleEvent *theAppleEvent, AppleEvent *reply, long refcon)
  24. {
  25. #pragma unused (refcon)
  26.  
  27.     AEDesc        directObj = {typeNull, NULL},
  28.                 result = {typeNull, NULL};
  29.     OSErr        err;
  30.  
  31.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  32.     
  33.             // There was a direct parameter
  34.     if (directObj.descriptorType != typeNull)
  35.         err = SelectDesc(&directObj, &result);
  36.     else    // There was no direct parameter
  37.     {
  38.         err = PutPStringToDescriptor(&result, "\pYou have not specified an object to select");
  39.         if (noErr != err) goto done;
  40.         err = errAENoSuchObject;
  41.     }
  42.  
  43.     err = AddResultToReply(&result, reply, err);
  44.  
  45. done:    
  46.     if (directObj.dataHandle)
  47.         AEDisposeDesc(&directObj);
  48.     if (result.dataHandle)
  49.         AEDisposeDesc(&result);
  50.         
  51.     return(err);
  52. } // DoSelect
  53.  
  54.  
  55. OSErr    SelectWindowToken(WindowToken* theToken)
  56. {
  57.     OSErr            err = noErr;
  58.     
  59.     if (! theToken->tokenWindow)
  60.         return(errAENoSuchObject);
  61.         
  62.     BringToFront(theToken->tokenWindow);
  63.                                     
  64.     return(err);
  65. }
  66.  
  67. OSErr    SelectWindowDesc(AEDesc* windowDesc)
  68. {
  69.     WindowToken        aWindowToken;
  70.     Size            actualSize;
  71.     OSErr            err;
  72.  
  73.     if (typeMyWndw != windowDesc->descriptorType)
  74.         return(errAETypeError);
  75.         
  76.     GetRawDataFromDescriptor(windowDesc, (Ptr)&aWindowToken, sizeof(aWindowToken), &actualSize);
  77.  
  78.     err = SelectWindowToken(&aWindowToken);
  79.     
  80.     return(err);
  81. }
  82.  
  83.  
  84. OSErr    SelectTextToken(TextToken* theToken)
  85. {
  86.     DPtr            docPtr;
  87.     OSErr            err = noErr;
  88.     
  89.     docPtr = DPtrFromWindowPtr(theToken->tokenWindow);
  90.     
  91.     if (! theToken->tokenWindow || ! docPtr)
  92.         return(errAENoSuchObject);
  93.     
  94.     TESetSelect(theToken->tokenOffset - 1,
  95.                     theToken->tokenOffset + theToken->tokenLength - 1,
  96.                                     docPtr->theText);
  97.                                     
  98.     return(err);
  99. }
  100.  
  101. OSErr    SelectTextDesc(AEDesc* textDesc)
  102. {
  103.     TextToken        aTextToken;
  104.     Size            actualSize;
  105.     OSErr            err;
  106.  
  107.     if (typeMyText != textDesc->descriptorType)
  108.         return(errAETypeError);
  109.         
  110.     GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  111.  
  112.     err = SelectTextToken(&aTextToken);
  113.     
  114.     return(err);
  115. }
  116.  
  117.  
  118. OSErr    SelectDesc(const AEDesc* aDesc, AEDesc* result)
  119. {
  120.     AEDesc        selectDesc = {typeNull, NULL},
  121.                 textDesc = {typeNull, NULL};
  122.     OSErr        err;
  123.     
  124.     if (typeObjectSpecifier == aDesc->descriptorType)
  125.         err = AEResolve(aDesc, kAEIDoMinimum, &selectDesc);
  126.     else
  127.         err = AEDuplicateDesc(aDesc, &selectDesc);
  128.         
  129.     if (noErr != err) goto done;
  130.     
  131.     switch (selectDesc.descriptorType)
  132.     {
  133.         case typeAEList:
  134.             err = PutPStringToDescriptor(result, "\pThis application cannot select a list of objects");
  135.             if (noErr != err) goto done;
  136.             err = errAETypeError;
  137.             break;
  138.             
  139.         case typeMyWndw:
  140.             err = SelectWindowDesc(&selectDesc);
  141.             break;
  142.             
  143.         default:
  144.             err = AECoerceDesc(&selectDesc, typeMyText, &textDesc);
  145.             if (noErr != err) goto done;
  146.             err = SelectTextDesc(&textDesc);
  147.     }
  148.     
  149. done:
  150.     if (selectDesc.dataHandle)
  151.         AEDisposeDesc(&selectDesc);
  152.     if (textDesc.dataHandle)
  153.         AEDisposeDesc(&textDesc);
  154.     
  155.     return(err);
  156. }
  157.  
  158.  
  159. // Given a window, this routine will fill out a TextToken with details
  160. // of the window's current selection. The total text length can also be retrieved
  161. // so that the selection can be updated depending on changes.
  162.  
  163. OSErr    GetWindowSelection(WindowPtr aWindow, TextToken* resultToken, short* resultLength)
  164. {
  165.     AEDesc        propertyDesc = {typeNull, NULL},
  166.                 dataDesc = {typeNull, NULL},
  167.                 textDesc = {typeNull, NULL};
  168.     TEHandle    aTextEditHandle;
  169.     OSErr        err = noErr;
  170.     
  171.     if (! aWindow)
  172.         return(errAENoSuchObject);
  173.     
  174.     aTextEditHandle = TEHandleFromWindow(aWindow);
  175.  
  176.     resultToken->tokenWindow = aWindow;
  177.                                     // TEHandle starts counting characters from 1, not 0
  178.     resultToken->tokenOffset = (*aTextEditHandle)->selStart + 1;
  179.     resultToken->tokenLength = (*aTextEditHandle)->selEnd - (*aTextEditHandle)->selStart;
  180.     
  181.     if (resultLength)
  182.         *resultLength = (*aTextEditHandle)->teLength;
  183.     
  184.     return(err);
  185. }
  186.  
  187.  
  188. // Given the selection that was deleted/changed/?moved? and the original
  189. // selection before the operation. Also the old length of text in the
  190. // TextEdit. This routine sorts out the selection that may change
  191. // due to position of delete/change/?move?. It returns in insertLength
  192. // the length of the inserted data (not just the difference).
  193.  
  194. OSErr    UpdateSelectionToken(TextToken* anInsertToken, TextToken* aSelectionToken,
  195.                                                 short oldLength, short* insertLength)
  196. {
  197.     TextToken    updatedToken;
  198.     short        newLength,        // Lots of local variables to make
  199.                 deleteLength,    // things clearer.
  200.                 insertOffset,
  201.                 selectOffset,
  202.                 selectLength,
  203.                 numPartial;
  204.     OSErr        err;
  205.     
  206.     if (! anInsertToken->tokenWindow || ! aSelectionToken->tokenWindow)
  207.         return(errAENoSuchObject);
  208.         
  209.     updatedToken.tokenWindow = aSelectionToken->tokenWindow;
  210.     
  211.     newLength = (*TEHandleFromWindow(anInsertToken->tokenWindow))->teLength;
  212.     deleteLength = anInsertToken->tokenLength;                        // Characters deleted
  213.     
  214.     insertOffset = anInsertToken->tokenOffset;
  215.     selectOffset = aSelectionToken->tokenOffset;
  216.     selectLength = aSelectionToken->tokenLength;
  217.  
  218.     *insertLength = newLength - oldLength + deleteLength;            // Characters inserted
  219.  
  220.     switch (TokenWithinToken(aSelectionToken, anInsertToken, &numPartial))
  221.     {
  222.         case kTokenBefore:
  223.             updatedToken.tokenOffset = selectOffset + *insertLength - deleteLength;
  224.             updatedToken.tokenLength = selectLength;
  225.             break;
  226.  
  227.         case kTokenAfter:
  228.         case kTokenPartialBefore:
  229.         case kTokenPartialAfter:
  230.             updatedToken.tokenOffset = selectOffset;
  231.             updatedToken.tokenLength = selectLength;
  232.             break;
  233.             
  234.         case kTokenWithin:
  235.             updatedToken.tokenOffset = selectOffset;
  236.             updatedToken.tokenLength = selectLength + *insertLength - deleteLength;
  237.             break;
  238.     }
  239.         
  240.     err = SelectTextToken(&updatedToken);
  241.     
  242.     return(err);
  243. }
  244.